package top.fwpsl.java.util.funcion;

import top.fwpsl.data.Data;
import top.fwpsl.data.PersonModel;
import top.fwpsl.java.util.funcion.inter.Interface01;
import top.fwpsl.java.util.funcion.inter.Interface02;
import top.fwpsl.java.util.funcion.inter.Interface03;

/**
 * Lamdb表达式
 * Lamdba表达式可理解为简洁的匿名函数，
 * 简单地说，它即没有声明的方法，也没有访问修饰符、返回值声明和名字。
 * 它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格，使 Java 语言的表达能力得到了提升。
 *
 * 语法：(parameters) -> expression
 *      (parameters) ->{ statements; }
 *
 * Lambda是建立在函数式接口的基础上的
 *
 * 方法引用
 *  简单地说，就是一个Lambda表达式。
 *  方法引用提供了一种引用而不执行方法的方式，它需要由兼容的函数式接口构成的目标类型上下文。
 *  计算时，方法引用会创建函数式接口的一个实例。
 * 当Lambda表达式中只是执行一个方法调用时，不用Lambda表达式，直接通过方法引用的形式可读性更高一些。
 *方法引用的方式：
 *      对象::实例方法名
 *      类::静态方法名
 *      类::实例方法名
 *      类::new （构造器引用）
 *      数组引用。Type::new （new String[]::new）
 *
 * @author 风戏fw
 */
public class LamdbaDemo {

    public static void main(String[] args) {
        test_lamdba_01();
    }

    private static void test_lamdba_01() {
        //1. 不需要参数,返回值为 "Hello World!"
        print(() -> "Hello World!");
        System.out.println();

        //2. 接收一个参数(数字类型),返回其2倍的值
        print(5, age -> age * 2);
        System.out.println();

        //3. 接受2个参数, 执行程序块
        print("风戏", 20, (name, age) -> {
            System.out.println(name + "的年龄是：" + age);
        });
        System.out.println();

        //4. 接受2个参数， 执行语句
        print("逐浪", 30, ((String name, Integer age) -> System.out.println(name + "的年龄是：" + age)));
        System.out.println();

        //遍历列表
        Data.getDate().forEach(person -> {
            System.out.println(person.getName());
        });
        System.out.println();

        //方法引用->引用类的静态方法，遍历列表
        Data.getDate().forEach(System.out::println);
        System.out.println();
        Data.getDate().forEach(LamdbaDemo::print);
        System.out.println();

        //方法引用->引用对象的实例方法，查询列表中是否有lujunyi
        PersonModel luJunYi = new PersonModel("lu jun yi", 35, "男");
        Data.getDate().stream().filter(luJunYi::equals).forEach(System.out::println);
    }

    private static void print(Interface03 interface03) {
        System.out.println("文本：" + interface03.getString());
    }

    private static void print(int value, Interface01 interface01) {
        System.out.println(value + "的二倍数值是：" + interface01.getDouble(value));
    }

    private static void print(String str, Integer value, Interface02 interface02) {
        interface02.print(str, value);
    }

    private static void print(PersonModel person) {
        System.out.println("我叫" + person.getName() + "今年" + person.getAge() + "岁");
    }

}
